package com.jiao.Controller;

import com.jiao.Exception.BizException;
import com.jiao.domain.Result;
import com.jiao.domain.VO.*;
import com.jiao.enums.ExceptionCodeEnum;
import com.jiao.service.ArticleService;
import com.jiao.service.LikeService;
import com.jiao.utils.ValidationUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Objects;

@RestController
@RequestMapping("/article")
public class ArticleController {
    @Autowired
    ArticleService articleService;

    @Autowired
    LikeService likeService;

    /*
    * 需要查询浏览量最高的前10篇文章的信息。要求展示文章标题和浏览量。把能让用户自己点击跳转到具体的文章详情进行浏览。
    * 注意：不能把草稿展示出来，不能把删除了的文章查询出来。要按照浏览量进行降序排序。
    * */
    @GetMapping("/hotArticleList")
    public Result<List<HotArticleVo>> selectAllArticle(){
        return articleService.hotArticleList();
    }

    /*
    * 要求在文章列表点击阅读全文时能够跳转到文章详情页面，可以让用户阅读文章正文。
    * 要求：①要在文章详情中展示其分类名
    * 传参为文章id，返回为文章详情 + 分类名
    * */
    @GetMapping("/{id}")
    public Result<ArticleVo> getArticleDetail(@PathVariable("id") Long id){
        if(id == 2){
            throw  new BizException(ExceptionCodeEnum.SYSTEM_ERROR,new Throwable("提交查询的文章Id为2"));
        }
        return articleService.selectArticleListByIds(id);
    }

    /*
    * pageNum为页数
    * pageSize为一页有多少数据显示。也就是一页取多少数据
    *
    * 在首页和分类页面都需要查询文章列表。
    * 首页：查询所有的文章
    * 分类页面：查询对应分类下的文章
    * 要求：①只能查询正式发布的文章 ②置顶的文章要显示在最前面
    * */
    @GetMapping("/selectArticleListByCategoryId")
    public Result<PageVo> selectArticleListByCategoryId(Integer pageNum, Integer pageSize, Long categoryId){
        //在controller层，进行数据验证。
        if(Objects.nonNull(categoryId)&&categoryId>0){
            return articleService.selectArticleListByCategoryId(pageNum,pageSize,categoryId);
        }else { return Result.error(ExceptionCodeEnum.SYSTEM_ERROR); }
    }

    @GetMapping("/like")
    public Result<LikeVo> like(Long articleId){
        if(Objects.isNull(articleId))
        {
            throw new BizException(ExceptionCodeEnum.SYSTEM_ERROR);
        }
        return likeService.like(articleId);
    }

    @GetMapping("/likers")
    public Result<List<LikeListVo>> selectLikers(Long articleId){
        if(Objects.isNull(articleId))
        {
            throw new BizException(ExceptionCodeEnum.SYSTEM_ERROR);
        }
        return likeService.selectAllLiker(articleId);
    }

    @GetMapping("/viewCount")
    public Result<Long> selectviewCount(Long articleId){
        ValidationUtils.validateReq(articleId, false);
        return articleService.selectViewCount(articleId);
    }

}
